﻿module DataList;

import std.stdio;
/+
  DataList为保存网络连接的数据类，用来提供高效的数据申请与回收管理。
+/
/+class TDataListA{
public:
	this(){
		gS.next =&gE;
		gE      =gS;
		gE.back =&gS;
	}
	//添加一个元素
	bool add(uint lkey,void* udata){
		//参数检查
		if (lkey<=0)       return false;
		if (udata is null) return false;
		//插入队列
		TDataList *dlTmp=new TDataList;
		dlTmp.key       =lkey;
		dlTmp.udata     =udata;
		dlTmp.back      =&gS;
		dlTmp.next      =gS.next;
		gS.next.back    =dlTmp;
		gS.next         =dlTmp;
		return true;
	}
	//弹出用户数据并删除当前记录
	void* drop(uint lkey){
		void *udata;
		TDataList *dlTmp;
		dlTmp=gS.next;
		if (lkey==0)
			return null;
		while(dlTmp !is null){
			if (dlTmp.key==lkey){
				dlTmp.next.back=dlTmp.back;
				dlTmp.back.next=dlTmp.next;
				udata=dlTmp.udata;
				delete dlTmp;
				return udata;
			}
			dlTmp=dlTmp.next;
		}
		return null;
	}
	//根据关键字取的用户数据
	void* GetData(uint lkey){
		TDataList *dlTmp=gS.next;
		if (lkey==0)
			return null;
		while(dlTmp !is null){
			if (dlTmp.key==lkey)
				return dlTmp.udata;
			dlTmp=dlTmp.next;
		}
		return null;
	}
	//替换关键字
	bool replacekey(uint lkey,uint newkey){
		TDataList *dlTmp=gS.next;
		if (lkey==0)
			return false;
		while(dlTmp !is null){
			if (dlTmp.key==lkey){
				dlTmp.key=newkey;
				return true;
			}
			dlTmp=dlTmp.next;
		}
		return false;
	}
	//取得表中元素个数
	uint getsize(){
		uint s;
		TDataList *dlTmp=gS.next;
		while(dlTmp !is null){
			dlTmp=dlTmp.next;
			++s;
		}
		return s-1;
	}
private:
	//这里为用户数据结构数组
	struct TDataList{
		uint  key  =0;   //初始化为0
		void* udata=null;//初始化为空

		TDataList* next;
		TDataList* back;
	};
	TDataList gS,gE;
}+/

/+
  新的数据管理类，使用稀疏数组来代替双向链表
+/
class TDataList{
public:
	//添加一个元素
	bool add(uint lkey,void* udata){
		//参数检查
		if (lkey<=0)       return false;
		if (udata is null) return false;
		gS[lkey]=udata;
		return true;
	}
	//弹出用户数据并删除当前记录
	void* drop(uint lkey){
		void *ret;
		//如果为空则返回第一个数据
		if (lkey==0){
			foreach(uint k,void *lp;gS){
				ret=lp;
				gS.remove(k);
				return ret;
			}
			return null;
		}
		void** p=(lkey in gS);//判断该关键字是否在数组中
		if (p!=null){
			ret=gS[lkey];
			gS.remove(lkey);
			return ret;
		}
		return null;
	}
	//根据关键字取的用户数据
	void* GetData(uint lkey){
		if (lkey==0)
			return null;
		void *ret;
		void** p=(lkey in gS);//判断该关键字是否在数组中
		if (p!=null){
			ret=gS[lkey];
			return ret;
		}
		return null;
	}
	//替换关键字
	bool replacekey(uint lkey,uint newkey){
		if (lkey==0 || newkey==0)
			return false;
		void** p=(lkey in gS);//判断该关键字是否在数组中
		if (p!=null){
			gS[newkey]=gS[lkey];
			return true;
		}
		return false;
	}
	//取得表中元素个数
	uint getsize(){
		return gS.length;
	}
private:
	void* [uint]gS;
}

